package br.com.gesclub.business.dao;

import java.io.Serializable;
import java.util.List;

import br.com.gesclub.business.model.BaseEntity;
import org.hibernate.criterion.Criterion;

/**
 * Definição do comportamento do Dao genérico. 
 *
 * @param <T> - tipo do objeto que será persistido. 
 * @param <ID> - tipo representa o ID de um objeto.
 */
public interface GenericDao<T extends BaseEntity, ID extends Serializable> {
	
	/**
	 * Persiste um objeto do tipo T.
	 * 
	 * @param object
	 * @return ID - O Id do objeto que foi persistido.
	 */
	ID save(final T object);

    /**
     * Persiste ou atualiza um objeto do tipo T.
     *
     * @param t
     * @return
     */
    void saveOrUpdate(T t);
	
	/**
	 * Deleta um objeto do tipo T do bando de dados.
	 * 
	 * @param object
	 */
	void delete(final T object);
	
	/**
	 * Atualiza um objeto do tipo T.
	 * 
	 * @param object
	 * @return T - O objeto do tipo T que foi atualizado.
	 */
	T update(T object);
	
	/**
	 * Recupera um objeto do tipo T pelo seu Id.
	 * 
	 * @param id
	 * @return T
	 */
	T findById(final ID id);
	
	/**
	 * Executa uma consulta com base nos critérios que são passados.
	 * 
	 * @param criterion - Restrictions da API Criteria do Hibernate.
	 * @return List<T>
	 */
	List<T> findByCriteria(final Criterion... criterion);
	
	/**
	 * Recupera todos os objetos de um tipo T.
	 * @return List<T>
	 */
	List<T> findAll();

}